home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / KBDCTRL.D < prev    next >
Encoding:
Modula Definition  |  1990-11-04  |  5.1 KB  |  141 lines

  1. DEFINITION MODULE KbdCtrl;
  2.  
  3. (*
  4.  *                                                 Thomas Tempelmann 28.08.88
  5.  *                                                             Stand 04.22.90
  6.  *
  7.  * Die Funktionen dieses Moduls bieten Zugriff auf den Tastaturpuffer.
  8.  * Sie können auch in Interruptroutinen aufgerufen werden.
  9.  *
  10.  * VORSICHT:
  11.  *   Die Funktionen, die direkt auf den Tastaturpuffer zugreifen, verhindern
  12.  *   nicht, daß währenddessen gerade ein neues Zeichen im Interrupt eingefügt
  13.  *   wird. Werden die Funktionen im Tastatur-Interrupt aufgerufen, macht
  14.  *   das natürlich nichts, weil währenddessen kein weiterer Interrupt auf-
  15.  *   treten kann. Erfolt der Aufruf aber aus dem User-Modus bzw. im normal
  16.  *   laufenden Programm, müssen währenddessen die Interrupts gesperrt werden.
  17.  *   Das ist beispielsweise durch ein "Monitor-Modul" (Priorität im Modulkopf,
  18.  *   muß mind. 5 sein!) oder durch die Funktion 'LockKeyBuffer' (s.u.) möglich.
  19.  *
  20.  * Damit bei den Tastenabfragen über die hiesigen Funktionen oder auch
  21.  * über die BIOS/GEMDOS-Funktionen im oberen Wort neben dem Scan-Code
  22.  * auch der Status der Shift-, Ctrl- und Alt- Tasten übermittelt wird,
  23.  * wird Bit 3 der Systemvariable 'conterm' (bei Adr. $484) automatisch
  24.  * bei der Initialisierung dieses Modul von seinem Körper (Body) gesetzt.
  25.  * Bei Prozeßende des (ältesten) importierenden Moduls oder Freigabe eines
  26.  * importierenden residenten Moduls/Programms wird der alte Wert in 'conterm'
  27.  * wiederhergestellt.
  28.  * Der alte Wert wird in der globalen Variablen 'PreviousMode' gerettet
  29.  * und kann ggf. verändert werden, um damit eine andere Rückstellung des
  30.  * Wertes bei Programmende/-freigabe zu bewirken.
  31.  * Zwischendurch kann der 'conterm'-Wert auch mit der Funktion 'SetMode'
  32.  * verändert werden.
  33.  *)
  34.  
  35. FROM MOSGlobals IMPORT Key, CtrlKey, CtrlSet;
  36. FROM SYSTEM IMPORT ADDRESS;
  37.  
  38.  
  39. VAR PreviousMode: BOOLEAN;
  40.  (*
  41.   * Enthält den Wert des 'conterm'-Bits (Nr.3) vor dem Start dieses
  42.   * Moduls.
  43.   * Der Wert dieser Variablen wird bei Programmende/-freigabe wieder
  44.   * nach 'conterm' geschrieben.
  45.   *)
  46.  
  47. PROCEDURE CurrentMode (): BOOLEAN;
  48. PROCEDURE SetMode (extended: BOOLEAN);
  49. PROCEDURE SetExtMode (VAR lastMode: BOOLEAN);
  50.  (*
  51.   * 'CurrentMode' liefert den aktuellen Status des Bit 3 aus 'conterm',
  52.   * 'SetMode' setzt oder löscht das Bit, je nach dem übergebenen
  53.   * BOOLEAN-Wert.
  54.   * 'SetExtMode' setzt das Bit und liefert in 'lastMode' den vorherigen
  55.   * Wert, sodaß dieser danach mit 'SetMode (lastMode)' zurückgesetzt
  56.   * werden kann (dies ist eine optimierte Funktion, um kurzzeitig das Bit
  57.   * zu setzen und danach wiederherzustellen).
  58.   * VORSICHT: Diese drei Prozeduren nicht in Interrupt-Routinen aufrufen!
  59.   *)
  60.  
  61.  
  62. PROCEDURE LookKey ( VAR k: Key; VAR ok: BOOLEAN );
  63.  (*
  64.   * Liefert die als nächste anstehende Taste (also die älteste im
  65.   * Puffer), ohne sie aus dem Puffer zu entfernen.
  66.   * Wenn 'ok' = FALSE, ist keine Taste vorhanden.
  67.   *)
  68.  
  69. PROCEDURE GetKey ( VAR k: Key; VAR ok: BOOLEAN );
  70.  (*
  71.   * Holt die als nächste anstehende (die älteste) Taste aus dem Puffer.
  72.   * Wenn 'ok' = FALSE, ist keine Taste vorhanden.
  73.   *)
  74.  
  75. PROCEDURE LookMostRecentKey ( VAR k: Key; VAR ok: BOOLEAN );
  76.  (*
  77.   * Liefert die zuletzt eingefügte Taste (also die jüngste im
  78.   * Puffer), ohne sie aus dem Puffer zu entfernen.
  79.   * Wenn 'ok' = FALSE, ist keine Taste vorhanden.
  80.   *)
  81.  
  82. PROCEDURE PushBackKey ( VAR k: Key; VAR ok: BOOLEAN );
  83.  (*
  84.   * Schreibt die Taste so in den Puffer zurück, daß sie als
  85.   * nächste Taste wieder ausgelesen wird.
  86.   * Wenn 'ok' = FALSE, ist der Puffer voll.
  87.   *)
  88.  
  89. PROCEDURE PutKey ( VAR k: Key; VAR ok: BOOLEAN );
  90.  (*
  91.   * Fügt die Taste in Puffer hinten an, so, als ob die Taste
  92.   * gedrückt worden wäre.
  93.   * Wenn 'ok' = FALSE, ist der Puffer voll.
  94.   *)
  95.  
  96. PROCEDURE ClrKeyBuffer;
  97.  (*
  98.   * Löscht die anstehenden Tasten im Puffer.
  99.   *)
  100.  
  101. PROCEDURE KeysAvail (): CARDINAL;
  102.  (*
  103.   * Liefert Anzahl der vorhandenen Tasten im Puffer
  104.   *)
  105.  
  106. PROCEDURE KeyBufferSize (): CARDINAL;
  107.  (*
  108.   * Liefert Fassungsvermögen des Puffers.
  109.   *)
  110.  
  111. VAR KbdRec: ADDRESS;
  112.  (*
  113.   * Zeigt auf den verwendeten Tastaturpuffer-Descriptor des BIOS.
  114.   * Wird von diesem Modul automatisch initialisiert, kann jedoch
  115.   * bei Bedarf verändert werden.
  116.   *)
  117.  
  118.  
  119. (*
  120.  *   Die folgenden beiden Funktionen erlauben es, mehrere Tasten mittels
  121.  * 'PutKey' oder 'PushBackKey' nacheinander in den Puffer zu schreiben,
  122.  * ohne daß Tastendrücke von der Tastatur dazwischengeraten können.
  123.  * Dazu werden alle Interrupts gesperrt.
  124.  *   Bei ihrer Verwendung ist unbedingt darauf zu achten, daß nach dem Aufruf
  125.  * von 'LockKeyBuffer' und dem Einfügen der Tasten wieder 'UnlockKeyBuffer'
  126.  * aufgerufen wird. Auch sollte die Zeit zwischen den beiden Aufrufen so
  127.  * kurz wie möglich gehalten werden.
  128.  *)
  129.  
  130. PROCEDURE LockKeyBuffer ( VAR hdl: LONGCARD );
  131.  (*
  132.   * Sperrt die Interrupts bis einschl. Level 6. Dabei wird in 'hdl'
  133.   * ein Wert zurückgegeben, der beim Aufruf von 'UnlockKeyBuffer'
  134.   * wieder übergeben werden muß.
  135.   *)
  136.  
  137. PROCEDURE UnlockKeyBuffer ( hdl: LONGCARD );
  138.  (* Gibt die Interrupts wieder frei *)
  139.  
  140. END KbdCtrl.
  141.